/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Modelo;

import com.eltima.components.demo.Demo;
import com.sun.media.MediaPlayer;
import com.sun.media.amovie.VisualComponent;
import com.sun.media.content.unknown.Handler;
import com.sun.media.util.SettableTime;
import java.awt.Component;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import java.util.Vector;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.media.CannotRealizeException;
import javax.media.CaptureDeviceInfo;
import javax.media.CaptureDeviceManager;
import javax.media.Format;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.NoPlayerException;
import javax.media.Player;
import javax.media.Time;
import javax.sound.midi.Track;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JSlider;
import javax.swing.filechooser.FileSystemView;

/**
 *
 * @author Luigi
 */
public class Reproducir extends Thread{
    Player reproduce=null;
    File cancion=null;
    File[] canciones=null;
    Filtro f=new Filtro();
    Track tr=null;
    JList<String> lista;
   
    
    //Constructor de la clase Repruducir
    public Reproducir(){
    }

    //Permite reproducir un archivo antes seleccionado
    //pero unicamente uno
    int contador=0;
    public void suena(){
        if (actual==0) {
            try {
                if(contador<=canciones.length-1){
                    //abre el contenido del array de canciones
                    reproduce = Manager.createRealizedPlayer(canciones[contador].toURL());
                    //reproduce
                    lista.setSelectedIndex(contador);
                    reproduce.start();
                    //recoorre el array de canciones cuando termina sigue la otra
                }
            } catch (Exception ex) {
                Logger.getLogger(Reproducir.class.getName()).log(Level.SEVERE, null, ex);
            }
        }else{
            pausar();
        }
    }

    //Selecciono el archivo que quiero que se reprodusca
    public void abrir(){
        int validar=0;
        JFileChooser abre=new JFileChooser();
        //Selecciona mas de un archivo a la vez
        abre.setFileSelectionMode(JFileChooser.FILES_ONLY);
        abre.setMultiSelectionEnabled(true);
        abre.setAccessory(new EtiquetaAccesory(abre));
        //fija el filtro al filechooser
        abre.setFileFilter(f);
        //abre.showOpenDialog(abre);
        validar=abre.showOpenDialog(abre);
        //Si la operacion realizada se lleva a cabo sige su conjunto de pasos
        //caso contrariotermina el JFileChooser
        if(validar==abre.APPROVE_OPTION){
            canciones=abre.getSelectedFiles();
            String[] lis=new String[canciones.length];
            int co=0;
            for (File file : canciones) {
               lis[co]=(file.getName());
               co=co+1;
            }
            lista.setListData(lis);
            //lista.setModel(new ModeloLista());
        }
        // cancion=abre.getSelectedFile();
    }


    //permite detener la cancion actual
    public void detener(){
        reproduce.stop();
    }
   
    double inicio=0;
    double fin=0;
    int actual=0;
    TimerTask tiempo=null;
    Timer ti=null;

    //Para hacer la barra avancce con la cancion
    public void barraProgreso(final JSlider barraProg){
        ti=new Timer();
        tiempo=new TimerTask() {
            @Override
            public void run() {
                fin=reproduce.getDuration().getNanoseconds();
                inicio=reproduce.getMediaTime().getNanoseconds();
                actual=(int)((inicio*100)/fin);
                barraProg.setValue(actual);
                detener(barraProg);
            }
        };
       ti.schedule(tiempo, 0, 1000);
    }

    //Permite pausar y arrancar desde la pausa anterior
    public void pausar(){
        Time tiempoactal=new SettableTime(actual);
        reproduce.syncStart(tiempoactal);
    }
    
    //permite pasar a la siguiente cancion seleccionada
    public void siguiente(){
        detener();
        contador=contador+1;
        actual=0;
        suena();
    }


    //permite pasar a la siguiente cancion seleccionada
    public void anterior(){
         detener();
        contador=contador-1;
        actual=0;
        suena();
    }

    //Metodo para detener y destruir el player una vez que se termina la reproduccion
    public void detener(JSlider barraProg){
       if (reproduce.getDuration().getSeconds()==reproduce.getMediaTime().getSeconds()) {
           reproduce.stop();
           actual=0;
           contador=contador+1;
           barraProg.setValue(0);
           suena();
       }
    }


    //Metodo para adelantar manualmente la cancion que se encuentre reproduciendose
    //en ese instante
    public void adelantarManualmente(int adelantar){
        if (adelantar!=0) {
            reproduce.stop();
            actual=(adelantar);
            Time tiemposeleccionado=new Time((long)(adelantar*reproduce.getDuration().getNanoseconds())/100);
            reproduce.syncStart(tiemposeleccionado);
        }
    }

    //Esto es todo el reproductor
    public Component componentes(){
         Component v=null;
         Component v2;
         List<Component>componentes=new ArrayList<Component>();
        // v2=reproduce.getVisualComponent();
         v=video.getVisualComponent();
        if (v!=null) {
            //v.setSize(20, 100);
            v.setSize(200, 30);
            return v;
            //componentes.add(v2);
        }else{
         return null;
        }
         
    }

    //Captura de Video con un driver universal de windows
    //(vfw:Microsoft WDM Image Capture (Win32):0)
    Player video=null;
    public void capturarVideo(){
        //Simplemente es el play que se usa para la reproduccion
        CaptureDeviceInfo informacion=new CaptureDeviceInfo();
        MediaLocator media=null;
        try {
        //Se captura el dirver
        informacion=CaptureDeviceManager.getDevice("vfw:Microsoft WDM Image Capture (Win32):0");
            media=informacion.getLocator();//new MediaLocator("vfw:Microsoft WDM Image Capture (Win32):0");
            video =  Manager.createPlayer(media);
            video.start();
        } catch (Exception ex) {
            Logger.getLogger(Reproducir.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void devices(){
        Vector devices = new Vector (javax.media.cdm.CaptureDeviceManager.getDeviceList());
        for(int i=0;i<devices.size();i++)
        System.out.println(devices.elementAt(i));
    }


//  public JList<String> getLista() {
  //          return lista;
    //    }

      //  public void setLista(JList<String> lista) {
        //    this.lista = lista;
        //}

}
